package com.blue.facade.sys.user.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.blue.common.BaseEntity;

@Table(name = "tb_sys_menu")
public class Menu extends BaseEntity implements Serializable {
    /**
     * 主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 父节点:一级菜单为0
     */
    @Column(name = "parent_id")
    private Long parentId;

    /**
     * 菜单名称
     */
    private String name;

    /**
     * 菜单URL
     */
    private String url;

    /**
     * 菜单类型（0：菜单类别，1：目录，2：菜单项，3：按钮）
     */
    private Integer type;

    /**
     * 资源唯一标识
     */
    private String identity;

    /**
     * 序号
     */
    private Integer number;

    /**
     * 层级:一级菜单,二级菜单,三级菜单
     */
    private Integer level;

    /**
     * 是否为叶子节点（0：否，1：是）
     */
    @Column(name = "is_leaf")
    private Integer isLeaf;
    
    /**
     * 图标
     */
    private String icon;

    /**
     * 是否隐藏
     */
    private Integer ihide;

    /**
     * 菜单显示样式（树型：tree，手风琴：accordion）
     */
    @Column(name = "show_style")
    private String showStyle;

    /**
     * 备注
     */
    private String remark;

    /**
     * 创建时间
     */
    @Column(name = "create_time")
    private Date createTime;

    /**
     * 更新时间
     */
    @Column(name = "update_time")
    private Date updateTime;

    private static final long serialVersionUID = 1L;
    
    @Transient
    private List<Menu> children ;
    
    public List<Menu> getChildren() {
		return children;
	}

	public void setChildren(List<Menu> children) {
		this.children = children;
	}

	/**
     * 获取主键
     *
     * @return id - 主键
     */
    public Long getId() {
        return id;
    }

    /**
     * 设置主键
     *
     * @param id 主键
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * 获取父节点:一级菜单为0
     *
     * @return parent_id - 父节点:一级菜单为0
     */
    public Long getParentId() {
        return parentId;
    }

    /**
     * 设置父节点:一级菜单为0
     *
     * @param parentId 父节点:一级菜单为0
     */
    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    /**
     * 获取菜单名称
     *
     * @return name - 菜单名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置菜单名称
     *
     * @param name 菜单名称
     */
    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    /**
     * 获取菜单URL
     *
     * @return url - 菜单URL
     */
    public String getUrl() {
        return url;
    }

    /**
     * 设置菜单URL
     *
     * @param url 菜单URL
     */
    public void setUrl(String url) {
        this.url = url == null ? null : url.trim();
    }

    /**
     * 获取菜单类型（0：菜单类别，1：目录，2：菜单项，3：按钮）
     *
     * @return type - 菜单类型（0：菜单类别，1：目录，2：菜单项，3：按钮）
     */
    public Integer getType() {
        return type;
    }

    /**
     * 设置菜单类型（0：菜单类别，1：目录，2：菜单项，3：按钮）
     *
     * @param type 菜单类型（0：菜单类别，1：目录，2：菜单项，3：按钮）
     */
    public void setType(Integer type) {
        this.type = type;
    }

    /**
     * 获取资源唯一标识
     *
     * @return identity - 资源唯一标识
     */
    public String getIdentity() {
        return identity;
    }

    /**
     * 设置资源唯一标识
     *
     * @param identity 资源唯一标识
     */
    public void setIdentity(String identity) {
        this.identity = identity == null ? null : identity.trim();
    }

    /**
     * 获取序号
     *
     * @return number - 序号
     */
    public Integer getNumber() {
        return number;
    }

    /**
     * 设置序号
     *
     * @param number 序号
     */
    public void setNumber(Integer number) {
        this.number = number;
    }

    /**
     * 获取层级:一级菜单,二级菜单,三级菜单
     *
     * @return level - 层级:一级菜单,二级菜单,三级菜单
     */
    public Integer getLevel() {
        return level;
    }

    /**
     * 设置层级:一级菜单,二级菜单,三级菜单
     *
     * @param level 层级:一级菜单,二级菜单,三级菜单
     */
    public void setLevel(Integer level) {
        this.level = level;
    }

    /**
     * 获取是否为叶子节点（0：否，1：是）
     *
     * @return is_leaf - 是否为叶子节点（0：否，1：是）
     */
    public Integer getIsLeaf() {
        return isLeaf;
    }

    /**
     * 设置是否为叶子节点（0：否，1：是）
     *
     * @param isLeaf 是否为叶子节点（0：否，1：是）
     */
    public void setIsLeaf(Integer isLeaf) {
        this.isLeaf = isLeaf;
    }

    /**
     * 获取图标
     *
     * @return icon - 图标
     */
    public String getIcon() {
        return icon;
    }

    /**
     * 设置图标
     *
     * @param icon 图标
     */
    public void setIcon(String icon) {
        this.icon = icon == null ? null : icon.trim();
    }

    /**
     * 获取是否隐藏
     *
     * @return ihide - 是否隐藏
     */
    public Integer getIhide() {
        return ihide;
    }

    /**
     * 设置是否隐藏
     *
     * @param ihide 是否隐藏
     */
    public void setIhide(Integer ihide) {
        this.ihide = ihide;
    }

    /**
     * 获取菜单显示样式（树型：tree，手风琴：accordion）
     *
     * @return show_style - 菜单显示样式（树型：tree，手风琴：accordion）
     */
    public String getShowStyle() {
        return showStyle;
    }

    /**
     * 设置菜单显示样式（树型：tree，手风琴：accordion）
     *
     * @param showStyle 菜单显示样式（树型：tree，手风琴：accordion）
     */
    public void setShowStyle(String showStyle) {
        this.showStyle = showStyle == null ? null : showStyle.trim();
    }

    /**
     * 获取备注
     *
     * @return remark - 备注
     */
    public String getRemark() {
        return remark;
    }

    /**
     * 设置备注
     *
     * @param remark 备注
     */
    public void setRemark(String remark) {
        this.remark = remark == null ? null : remark.trim();
    }

    /**
     * 获取创建时间
     *
     * @return create_time - 创建时间
     */
    public Date getCreateTime() {
        return createTime;
    }

    /**
     * 设置创建时间
     *
     * @param createTime 创建时间
     */
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /**
     * 获取更新时间
     *
     * @return update_time - 更新时间
     */
    public Date getUpdateTime() {
        return updateTime;
    }

    /**
     * 设置更新时间
     *
     * @param updateTime 更新时间
     */
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", id=").append(id);
        sb.append(", parentId=").append(parentId);
        sb.append(", name=").append(name);
        sb.append(", url=").append(url);
        sb.append(", type=").append(type);
        sb.append(", identity=").append(identity);
        sb.append(", number=").append(number);
        sb.append(", level=").append(level);
        sb.append(", isLeaf=").append(isLeaf);
        sb.append(", icon=").append(icon);
        sb.append(", ihide=").append(ihide);
        sb.append(", showStyle=").append(showStyle);
        sb.append(", remark=").append(remark);
        sb.append(", createTime=").append(createTime);
        sb.append(", updateTime=").append(updateTime);
        sb.append(", serialVersionUID=").append(serialVersionUID);
        sb.append("]");
        return sb.toString();
    }

    @Override
    public boolean equals(Object that) {
        if (this == that) {
            return true;
        }
        if (that == null) {
            return false;
        }
        if (getClass() != that.getClass()) {
            return false;
        }
        Menu other = (Menu) that;
        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
            && (this.getParentId() == null ? other.getParentId() == null : this.getParentId().equals(other.getParentId()))
            && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName()))
            && (this.getUrl() == null ? other.getUrl() == null : this.getUrl().equals(other.getUrl()))
            && (this.getType() == null ? other.getType() == null : this.getType().equals(other.getType()))
            && (this.getIdentity() == null ? other.getIdentity() == null : this.getIdentity().equals(other.getIdentity()))
            && (this.getNumber() == null ? other.getNumber() == null : this.getNumber().equals(other.getNumber()))
            && (this.getLevel() == null ? other.getLevel() == null : this.getLevel().equals(other.getLevel()))
            && (this.getIsLeaf() == null ? other.getIsLeaf() == null : this.getIsLeaf().equals(other.getIsLeaf()))
            && (this.getIcon() == null ? other.getIcon() == null : this.getIcon().equals(other.getIcon()))
            && (this.getIhide() == null ? other.getIhide() == null : this.getIhide().equals(other.getIhide()))
            && (this.getShowStyle() == null ? other.getShowStyle() == null : this.getShowStyle().equals(other.getShowStyle()))
            && (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark()))
            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))
            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
        result = prime * result + ((getParentId() == null) ? 0 : getParentId().hashCode());
        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
        result = prime * result + ((getUrl() == null) ? 0 : getUrl().hashCode());
        result = prime * result + ((getType() == null) ? 0 : getType().hashCode());
        result = prime * result + ((getIdentity() == null) ? 0 : getIdentity().hashCode());
        result = prime * result + ((getNumber() == null) ? 0 : getNumber().hashCode());
        result = prime * result + ((getLevel() == null) ? 0 : getLevel().hashCode());
        result = prime * result + ((getIsLeaf() == null) ? 0 : getIsLeaf().hashCode());
        result = prime * result + ((getIcon() == null) ? 0 : getIcon().hashCode());
        result = prime * result + ((getIhide() == null) ? 0 : getIhide().hashCode());
        result = prime * result + ((getShowStyle() == null) ? 0 : getShowStyle().hashCode());
        result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode());
        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());
        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());
        return result;
    }
}